package com.gxa.learning.core.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CopyObjectResult;

import java.io.InputStream;

/**
 * 上传文件到阿里云的工具类
 *
 * @author YXQ
 * @date 2021/11/10 16:22
 */
public class OssUtil {
    /**
     * yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
     */
    private static final String ENDPOINT = "https://oss-cn-chengdu.aliyuncs.com";

    /**
     * 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
     */
    private static final String ACCESS_KEY_ID = "LTAI5tLzdLHtGTj6yw925ap5";
    private static final String ACCESS_KEY_SECRET = "yIc0h6CzTpXI5Pa23OtfXbdBUdz1Kb";

    /**
     * 填写Bucket名称。
     */
    private static final String BUCKET_NAME = "bucket-yanxiaoqi";

    /**
     * 上传图片的操作
     *
     * @param fileName    文件名.文件名包含路径，不包含Bucket名称。learning/01.txt。
     * @param inputStream 输入流对象
     */
    public static void upload(String fileName, InputStream inputStream) {
        // 创建连接
        OSS ossClient = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
            // 核心上传操作:三个参数
            // bucketName:桶名
            // fileName:文件名
            // inputStream:流对象
            ossClient.putObject(BUCKET_NAME, fileName, inputStream);
        } finally {
            // 如果连接不为空
            if (ossClient != null) {
                // 关闭OSSClient。
                ossClient.shutdown();
            }
        }
    }

    /**
     * 删除单个文件
     *
     * @param fileName 文件名。文件名包含路径，不包含Bucket名称。learning/01.txt。
     */
    public static void delete(String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        // 删除文件或目录。如果要删除目录，目录必须为空。
        ossClient.deleteObject(BUCKET_NAME, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 判断文件是否存在
     *
     * @param fileName 全路径文件名称。文件名包含路径，不包含Bucket名称。learning/01.txt。
     * @return 返回boolean, 存在返回true
     */
    public static boolean fileExist(String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        boolean found = ossClient.doesObjectExist(BUCKET_NAME, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
        return found;
    }

    /**
     * 复制文件的操作
     *
     * @param oldFilePath 旧的文件路径
     * @param newFilePath 新的文件路径
     * @return 复制结果
     */
    public static CopyObjectResult copyFile(String oldFilePath, String newFilePath) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        // 拷贝文件
        CopyObjectResult copyObjectResult = ossClient.copyObject(BUCKET_NAME, oldFilePath, BUCKET_NAME, newFilePath);
        // 关闭连接
        ossClient.shutdown();
        return copyObjectResult;
    }
}
